package cn.gok.day6;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @ClassName MapTest
 * @Description TODO
 * @Author Oscar
 * @Date 10:50 2022/7/11
 * @Version 1.0
 **/
public class MapTest {
    public static void main(String[] args) {
//        map接口的常用方法
//        mapApi();
//        map遍历的方法
//        mapFor();
//        treemap案例
//        treeMapApi();
//        lambdaApi(()->System.out.println("lambda表达式"));
//        lambdaAccept();
//        supplierApi();
        functionApi();

    }


    private static void treeMapApi() {
//        排序方案默认按照从小到大排序
        Map<Integer,String> map=new TreeMap<>();
        map.put(1, "one");
        map.put(3, "two");
        map.put(2, "three");
        Set set=map.keySet();
        set.stream().forEach(s-> System.out.println(map.get(s)));
//        可以自定义排序方式，利用在key类中实现Comparable接口，或者利用匿名内部类来实现
        Map<Pojo,String> map2=new TreeMap<>(new Comparator<Pojo>() {
//            这里示范的是第二种匿名内部类的方式
            @Override
            public int compare(Pojo o1, Pojo o2) {
                if(o1.equals(o2)){
//                    不实现等于O的情况会出现remove方法是小的现象
                    return 0;
                }
                if(o1.getAge()> o2.getAge()){
                    return 1;
                }
                return -1;
            }
        });
        map2.put(new Pojo(18,"陈冠希","男"),"警察");
        map2.put(new Pojo(18,"刘亦菲","女"),"女侠");
        map2.put(new Pojo(22,"罗涛","男"),"学生");
        Set set2=map2.keySet();
        set2.stream().forEach(s-> System.out.println(map2.get(s)));

    }

    private static void mapFor() {
//        利用keyset遍历
        Map<Integer,String> map=new HashMap<>();
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");
        Set set=map.keySet();
        System.out.println("第一种遍历方式：keyset");
        set.stream().forEach(s-> System.out.println(map.get(s)));
        System.out.println("第二种遍历方式：迭代器-keyset");
        Iterator<Integer> it=map.keySet().iterator();
        while (it.hasNext()){
            System.out.println(map.get(it.next()));
        }
        System.out.println("第三种遍历方式：entryset");
        for(Map.Entry<Integer,String> e:map.entrySet()){
            System.out.println(e.getKey()+"---"+e.getValue());
        }
        System.out.println("第四种遍历方式：迭代器-entryset");
        Iterator<Map.Entry<Integer,String>> ite=map.entrySet().iterator();
        while (ite.hasNext()){
            Map.Entry<Integer,String> tp=ite.next();
            System.out.println(tp.getKey()+"==="+tp.getValue());
        }
        System.out.println("第五种遍历方式：利用流来遍历---keyset");
        map.keySet().stream().forEach(s-> System.out.println(s+"==="+map.get(s)));
        System.out.println("第六种遍历方式：利用流来遍历---entryset");
        map.entrySet().stream().forEach(s-> System.out.println(s.getKey()+"==="+s.getValue()));


    }

    private static void mapApi() {
        Map<Integer,String> map=new HashMap<>();
//        添加
        System.out.println(map.put(1, "one"));//put返回的是key存在的被替换的value
        System.out.println(map.put(2, "two"));
        System.out.println(map.put(1, "three"));

//        返回map长度
        System.out.println(map.size());

//        删除，返回值是被删除key值得value
        System.out.println(map.remove(1));

//        是否包含key
        System.out.println(map.containsKey(2));
//        是否包含value
        System.out.println(map.containsValue("3"));

    }
//    lambda表达式
    public static void lambdaApi(Runnable r){
//        Runnable r= ()->{
//            int l=520;//局部变量
//            System.out.println("lambda表达式定义的局部变量："+l);
//        };
        r.run();
    }
    public static void lambdaAccept(){
        Consumer<String> c1=(String s)->{
          s+=" one";
            System.out.println(s);
        };
        Consumer<String> c2=(String s)->{
            s+=" two";
            System.out.println(s);
        };

        System.out.println("一次消费");
        c1.accept("accept执行lambda");
        System.out.println("两次消费");
        c1.andThen(c2).accept("accept执行lambda");
    }
//    supplier接口
    public static void supplierApi(){
//        没有入参，有返回值
        Supplier<String> s=()->new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
        System.out.println(s.get());
    }
//    一个入参，有返回值
    public static void functionApi(){
        Function<String,Integer> f=s -> s.length();
//        执行消费
        System.out.println(f.apply("my name is oscar"));
//        两次消费
        Function<Integer,Integer> f2=i->i+100;
        System.out.println("利用compose执行两次，后面的方法体返回值给第一个方法体使用");
        System.out.println(f2.compose(f).apply("my name is oscar"));
    }
}
